%Seleccion de caracteristicas
%
%
%
function [f fn d] = SeleccionCaracteristicas()
%Se prepara los archivos de LOGs
tic
[fg, tex] = fopen('resultados_seleccion.csv', 'a');
fprintf(fg, 'N Caractersiticas, KERNEL POLY, KERNEL LINEAR, KERNEL GAUSS, GDA GAUSS \n');
tipo = 2;

for i=0:20
evaluaPCA(tipo, fg);
end


tipo = 3;
for i=0:20
evaluaPCA(tipo, fg);
end

toc
fprintf(fg, '\nFIN tiempo = %f\n', toc );
st = fclose(fg);
end 
function [f fn d] = evaluaPCA(tipo, fg)

[fi, tex] = fopen('prueba_toolbox.txt', 'a');

load caracteristicas.mat;
[fs  ds] = getCaracteristicas(f, d, 1);
cantidadCaracteristicas = [2 4 8 10 20 30];
%Se normaliza, y se quitan los datos malos
fsn= norm_sfs(fs,ds);
[Xe De Xt Dt indice_entrenamiento indice_prueba] =  getMatrizTrainigMatrizTest(fsn,ds(:,tipo));


%PRXT1=0;
PRXT2=0;
PRXT3=0;
PRXT4=0;
PRXT5=0;
 
  for i=1:length(cantidadCaracteristicas)
%      try
%          [X_bnb, X_bnb_test] = estrategia2(fs,fsn,fn,Xe, De, Xt, indice_entrenamiento,indice_prueba, cantidadCaracteristicas(i),fi);
%          dsXT = knn(X_bnb,De, X_bnb_test,10);
%          [TXT ,pXT]  = confusion(Dt,dsXT);
%          PRXT1 = mean(pXT)*100;
% 
% 
%      catch me1
%          fprintf(fi, 'ERROR %d %s \n',cantidadCaracteristicas(i), me1.message );
%      end

     try
         [X_bnb, X_test] = estrategia1(fs,fsn,fn,Xe, De, Xt, indice_entrenamiento,indice_prueba, cantidadCaracteristicas(i),fi);
         dsXT = knn(X_bnb,De, X_test,10);
         [TXT ,pXT]  = confusion(Dt,dsXT);
         PRXT2 = mean(pXT)*100;


     catch me1
         fprintf(fi, 'ERROR %d %s \n',cantidadCaracteristicas(i), me1.message );
     end

     try
         [X_bnb, X_bnb_test] = estrategia3(fs,fsn,fn,Xe, De, Xt, indice_entrenamiento,indice_prueba, cantidadCaracteristicas(i),fi);
         dsXT = knn(X_bnb,De, X_bnb_test,10);
         [TXT ,pXT]  = confusion(Dt,dsXT);
         PRXT3 = mean(pXT)*100;


     catch me1
         fprintf(fi, 'ERROR %d %s \n',cantidadCaracteristicas(i), me1.message );
     end
     try
         [X_bnb, X_bnb_test] = estrategia4(fs,fsn,fn,Xe, De, Xt, indice_entrenamiento,indice_prueba, cantidadCaracteristicas(i),fi);
         dsXT = knn(X_bnb,De, X_bnb_test,10);
         [TXT ,pXT]  = confusion(Dt,dsXT);
         PRXT4 = mean(pXT)*100;
     catch me1
         fprintf(fi, 'ERROR %d %s \n',cantidadCaracteristicas(i), me1.message );
     end

     try
         [X_bnb, X_bnb_test] = estrategia5(fs,fsn,fn,Xe, De, Xt, indice_entrenamiento,indice_prueba, cantidadCaracteristicas(i),fi);
         dsXT = knn(X_bnb,De, X_bnb_test,10);
         [TXT ,pXT]  = confusion(Dt,dsXT);
         PRXT5 = mean(pXT)*100;
     catch me1
         fprintf(fi, 'ERROR %d %s \n',cantidadCaracteristicas(i), me1.message );
     end



        
         fprintf(fg, '\n %d, %f, %f, %f, %f', cantidadCaracteristicas(i), PRXT2,PRXT3,PRXT4,PRXT5);
  end
end
 







function [XPCA_entrenamiento ,XPCA_test] = estrategia1(f,fs, fn,Xe, De, Xt, indice_entrenamiento,indice_prueba, m,fi)
try
    %Los juntamos
%     no_dims = round(intrinsic_dim(Xe, 'MLE'));
    XPCA2 = compute_mapping(f, 'KernelPCA', m, 'poly');
    XPCA2 = normalize(XPCA2, 1);
    XPCA_entrenamiento= XPCA2(indice_entrenamiento,:);
    XPCA_test = XPCA2(indice_prueba, :);

%     XPCA2 = compute_mapping(Xe, 'KernelPCA', m, 'poly');
%     XPCA_entrenamiento = normalize(XPCA2, 1);
%     XPCA2 = compute_mapping(Xt, 'KernelPCA', m, 'poly');
%     XPCA_test = normalize(XPCA2, 1);
    
    
%      XPCA_entrenamiento= XPCA2(indice_entrenamiento,:);
%      XPCA_test = XPCA2(indice_prueba, :);



catch me4
    fprintf(fi, 'ERROR estrategia %d %s \n',m  ,me4.message );
end
end

function [XPCA_entrenamiento, XPCA_test ] = estrategia2(f,fs, fn,Xe, De, Xt, indice_entrenamiento,indice_prueba, m,fi)
try
    %Los juntamos

XPCA2 = bpca(f,m);
XPCA2 = normalize(XPCA2, 1);
XPCA_entrenamiento= XPCA2(indice_entrenamiento,:);
XPCA_test = XPCA2(indice_prueba, :);
    
catch me4
    fprintf(fi, 'ERROR estrategia %d %s \n',m  ,me4.message );
end
end
function [XPCA_entrenamiento, XPCA_test ] = estrategia3(f,fs, fn,Xe, De, Xt, indice_entrenamiento,indice_prueba, m,fi)
try
    %Los juntamos
 XPCA2 = compute_mapping(f, 'KernelPCA', m, 'linear');
    XPCA2 = normalize(XPCA2, 1);
    XPCA_entrenamiento= XPCA2(indice_entrenamiento,:);
    XPCA_test = XPCA2(indice_prueba, :);
    
catch me4
    fprintf(fi, 'ERROR estrategia %d %s \n',m  ,me4.message );
end
end
function [XPCA_entrenamiento, XPCA_test ] = estrategia4(f,fs, fn,Xe, De, Xt, indice_entrenamiento,indice_prueba, m,fi)
try
    %Los juntamos
 XPCA2 = compute_mapping(f, 'KernelPCA', m, 'gauss');
    XPCA2 = normalize(XPCA2, 1);
    XPCA_entrenamiento= XPCA2(indice_entrenamiento,:);
    XPCA_test = XPCA2(indice_prueba, :);
    
catch me4
    fprintf(fi, 'ERROR estrategia %d %s \n',m  ,me4.message );
end
end

function [XPCA_entrenamiento, XPCA_test ] = estrategia5(f,fs, fn,Xe, De, Xt, indice_entrenamiento,indice_prueba, m,fi)
try
    %Los juntamos
 XPCA2 = compute_mapping(f, 'GDA', m, 'linear');
    XPCA2 = normalize(XPCA2, 1);
    XPCA_entrenamiento= XPCA2(indice_entrenamiento,:);
    XPCA_test = XPCA2(indice_prueba, :);
    
catch me4
    fprintf(fi, 'ERROR estrategia %d %s \n',m  ,me4.message );
end
end



function [X D] = getCaracteristicas(f, d, caliz)
indices =  find(d(:,1)==caliz);
D = d(indices,:);
X = f(indices,:);
end

